﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.ServiceModel;

namespace Mongaba.Core
{
    internal static class Utilities
    {
        public static String GenerateUniqueIdentifier()
        {
            return new Guid().ToString();
        }

        #region Ip Control
        static IPAddress hostIp = null;
        /// <summary>
        /// IP principal da máquina host.
        /// </summary>
        public static IPAddress HostIp
        {
            get
            {               
                return hostIp;
                
            }
            set {
                hostIp = value;
            }
        }

        public static IPAddress[] AvailableIps
        {
            get {
                IPHostEntry ipEntry = Dns.GetHostEntry(Dns.GetHostName());
                IPAddress[] addr = ipEntry.AddressList.Where(x => x.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToArray();
                return addr;
            }
        }
        #endregion
        #region Names
        /// <summary>
        /// Nome do canal TCP do cliente.
        /// </summary>
        public static String ProcessBindingName 
        {
            get { return "ProcessBinding"; }
        }

        /// <summary>
        /// Nome do serviço de coordenação
        /// </summary>
        public static String CoordinatorServiceName
        {
            get { return "MongabaCoordinatorService"; }
        }

        /// <summary>
        /// Nome do serviço de processo
        /// </summary>
        public static String ProcessServiceName
        {
            get { return "MongabaProcessService"; }
        }

        /// <summary>
        /// Nome do canal TCP do coordenador.
        /// </summary>
        public static  String CoordinatorBindingName
        {
            get { return "CoordinatorBinding"; }
        }
        #endregion
        #region Ports
        /// <summary>
        /// Porta principal de coordenação.
        /// </summary>
        public static int CoordinatorServiceMainPort
        {
            get{return 50001;}
        }

        /// <summary>
        /// Porta de recebimento de IPs de coordenadores via broadCast.
        /// </summary>
        public static int ProcessResponseListenerPort
        {
             get
             {
                    return   50002;
             }

        }

        /// <summary>
        /// Porta de recebimento de IPs de processos e coordenadores via broadcast.
        /// </summary>
        public static int CoordinatorRequestListenerPort
        {
            get
            {
                return 50003;
            }
        }


        /// <summary>
        /// Porta do serviço do processo.
        /// </summary>
        public static int ProcessServiceMainPort
        {
            get
            {
                return 50004;
            }
        }
        
        #endregion

        /// <summary>
        /// Tempo de checagem de atividade do coordenador pelo processo
        /// </summary>
        public static int CoordinatorStatusCheckerDelay
        {
            get
            {
                return 15000;
            }
        }

        /// <summary>
        /// Tempo de atualização da lista de processos ativos pelo coordenador.
        /// </summary>
        public static int ProcessListUpdateDelay
        {
            get {
                return 8000;
            }
        }

        /// <summary>
        /// Tempo de atualização da pontuação dos processos.
        /// </summary>
        public static int ProcessScoreUpdateDelay
        {
            get
            {
                return 45000;
            }
        }

        /// <summary>
        /// Tempo de atualização da lista de coordenadores conhecidos.
        /// </summary>
        public static int KnownCoordinatorsCheckerDelay
        {
            get {
                return 30000;
            }
        }

        /// <summary>
        /// Tempo de verificação da lista de coordenadores conhecidos.
        /// </summary>
        public static int KnownCoordinatorsVerificationDelay
        {
            get
            {
                return 40000;
            }
        }

        /// <summary>
        /// Tempo de verificação de grupos iguais.
        /// </summary>
        public static int EqualsGrupsCheckerDelay
        {
            get
            {
                return 60000;
            }
        }



        #region Endpoints

        public static EndpointAddress generateProcessEndPointAddress(string address)
        {
            return new EndpointAddress(String.Format("net.tcp://{0}:{1}/{2}", address, ProcessServiceMainPort, ProcessServiceName));
        }

        public static EndpointAddress generateCoordinatorEndPointAddress(string address)
        {
            return new EndpointAddress(String.Format("net.tcp://{0}:{1}/{2}", address, CoordinatorServiceMainPort, CoordinatorServiceName));
        }

        #endregion



    }
}
